<?php
/**
 * Created by PhpStorm.
 * User: tengjs
 * Date: 2020/11/3
 * Time: 7:27
 */

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;

class BaseController extends Controller
{
    /**
     * 成功响应
     *
     * @param array  $data 数据
     * @param string $msg  成功信息
     * @param string $info 额外信息，正式环境不会返回，可放一些调试信息等
     *
     * @return array
     */
    public function success($data = [], $msg = '', $info = '')
    {
        return ['code' => 0, 'msg' => $msg, 'data' => $data, 'info' => app()->environment('production') ? '' : $info];
    }

    /**
     * 失败响应
     *
     * @param string $msg  失败信息
     * @param int    $code 错误码
     * @param string $info 额外信息，正式环境不会返回，可放一些调试信息等
     *
     * @return array
     */
    public function failure($msg = '', $code = 1, $info = '')
    {
        return ['code' => $code, 'msg' => $msg, 'data' => null, 'info' => app()->environment('production') ? '' : $info];
    }

    /**
     * 组装分页
     *
     * @param LengthAwarePaginator $pageData
     *
     * @return array
     */
    public function buildPageList(LengthAwarePaginator $pageData)
    {
        return [
            'total'        => $pageData->total(),
            'per_page'     => $pageData->perPage(),
            'current_page' => $pageData->currentPage(),
            'last_page'    => $pageData->lastPage(),
            'list'         => !empty($pageData->items()) ? json_decode(json_encode_options($pageData->items()), true) : []
        ];
    }

    /**
     * 组装图片URL
     *
     * @param string $url
     *
     * @return string
     */
    public function buildImageUrl($url)
    {
        return empty($url) ? '' : '/upload/' . $url;
    }

    /**
     * 字符串截取
     *
     * @param string $string
     * @param string $lang
     * @param int    $wordLimit
     *
     * @return string
     */
    function limitWords(string $string, string $lang, int $wordLimit)
    {
        $string = strip_tags($string);
        if ('en' === $lang) {
            $words = explode(' ', $string);
            return implode(' ', array_splice($words, 0, $wordLimit));
        }

        return mb_substr($string, 0, $wordLimit);
    }

    /**
     * Validator验证信息提示语，仅添加了常用的
     * 用法：在子类Controller中使用
     * array_merge($this->messages(), [
     *      'account.unique' => '账号已注册'
     *      'mobile.unique' => '手机号已注册'
     * ])
     *
     * @return array
     */
    public function messages()
    {
        return [
            'required' => ':attribute 不能为空',
            'filled'   => ':attribute 不能为空',
            'integer'  => ':attribute 必须为整数',
            'string'   => ':attribute 必须为字符串',
            'in'       => ':attribute 超出可选值范围',
            'min'      => ':attribute 超过了最小范围',
            'size'     => ':attribute 需为 :size 个字符长度',
            'date'     => ':attribute 需为日期格式',
        ];
    }

    /**
     * Validator验证信息提示语别名，仅添加了常用的
     * 用法：在子类Controller中使用
     * array_merge($this->attributes(), [
     *      'name' => '姓名'
     * ])
     *
     * @return array
     */
    public function attributes()
    {
        return [
            'token'        => '用户token',
            'email'        => '邮箱',
            'mobile'       => '手机号',
            'account'      => '账号',
            'password'     => '密码',
            'verify_code'  => '验证码',
            'type'         => '类型type',
            'lang'         => '语言',
            'sequence_id'  => '岗位类别',
            'user_id'      => '用户ID',
            'content_id'   => '记录ID',
            'timeline_id'  => '时间线ID',
            'content_type' => '文案类型',
        ];
    }
}
